package cn.kennylee.codehub.feign.interceptor.caller.remote.interceptors;

import org.springframework.http.HttpHeaders;

import java.util.Collection;
import java.util.Map;

/**
 * <p>Feign上下文工具类</p>
 * <p>Created on 2025/8/15.</p>
 *
 * @author kennylee
 * @since 0.0.1
 */
public class FeignContextHolder {

    private static final ThreadLocal<CustomFeignContext> FEIGN_CONTEXT_HOLDER = ThreadLocal.withInitial(CustomFeignContext::new);

    /**
     * 获取Feign上下文
     *
     * @return FeignContext
     */
    public static CustomFeignContext getFeignContext() {
        return FEIGN_CONTEXT_HOLDER.get();
    }

    /**
     * 设置Feign上下文
     *
     * @param feignContext FeignContext
     */
    public static void setFeignContext(CustomFeignContext feignContext) {
        FEIGN_CONTEXT_HOLDER.set(feignContext);
    }

    /**
     * 清除Feign上下文
     */
    public static void clear() {
        FEIGN_CONTEXT_HOLDER.remove();
    }

    /**
     * 添加阻塞头部
     *
     * @param headerName 阻塞头部名称
     */
    public static void addBlockHeader(String headerName) {
        FEIGN_CONTEXT_HOLDER.get().getBlockHeaders().add(headerName);
    }

    /**
     * 添加阻塞头部列表
     *
     * @param headerNames 阻塞头部名称列表
     */
    public static void addBlockHeader(Collection<String> headerNames) {
        FEIGN_CONTEXT_HOLDER.get().getBlockHeaders().addAll(headerNames);
    }

    /**
     * 激活转发请求头部功能
     */
    public static void enableForwardHeaders() {
        FEIGN_CONTEXT_HOLDER.get().setForwardHeaders(true);
    }

    /**
     * 禁用转发请求头部功能
     */
    public static void disableForwardHeaders() {
        FEIGN_CONTEXT_HOLDER.get().setForwardHeaders(false);
    }

    /**
     * 设置自定义请求头部
     *
     * @param headers 自定义请求头部
     */
    public static void addCustomHeaders(Map<String, String> headers) {
        FEIGN_CONTEXT_HOLDER.get().getHeaders().putAll(headers);
    }

    /**
     * 设置自定义请求头部
     */
    public static void setCustomHeaders(Map<String, String> headers) {
        FEIGN_CONTEXT_HOLDER.get().getHeaders().clear();
        FEIGN_CONTEXT_HOLDER.get().getHeaders().putAll(headers);
    }

    /**
     * 添加自定义请求头部
     *
     * @param header 请求头部名称
     * @param value  请求头部值
     */
    public static void addCustomHeaders(String header, String value) {
        FEIGN_CONTEXT_HOLDER.get().getHeaders().put(header, value);
    }

    /**
     * 添加授权头部
     *
     * @param headerValue 授权头部值
     */
    public static void addAuthorization(String headerValue) {
        FEIGN_CONTEXT_HOLDER.get().getHeaders().put(HttpHeaders.AUTHORIZATION, headerValue);
    }

    public static void blockAuthorization() {
        FEIGN_CONTEXT_HOLDER.get().getBlockHeaders().add(HttpHeaders.AUTHORIZATION);
    }

    /**
     * 设置是否一次性清除请求头部
     * <p>默认开启，否则，需要自己管理 FeignContextHolder#clear() 的时机</p>
     *
     * @param isClearAtOnce 是否一次性清除请求头部
     */
    public static void setIsClearAtOnce(boolean isClearAtOnce) {
        FEIGN_CONTEXT_HOLDER.get().setClearAtOnce(isClearAtOnce);
    }
}
